package com.zjun.util;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.scripting.support.ResourceScriptSource;

public class RedisLuaHelper {

	@Resource
	private RedisTemplate<String, Object> redisTemplate;

	@Resource
	private StringRedisTemplate stringRedisTemplate;

	/**
	 * - 执行lua脚本
	 * @param fileClasspath
	 * @param returnType
	 * @param keys
	 * @param values
	 * @return
	 * @author zJun
	 * @date 2020年7月24日 上午10:47:20
	 */
	public <E> E runLua(String fileClasspath, Class<E> returnType, List<String> keys, Object[] values) {
		return redisTemplate.execute(getScript(fileClasspath, returnType), keys, values);
	}

	/**
	 * - 执行lua脚本
	 * @param fileClasspath
	 * @param keys
	 * @param values
	 * @return
	 * @author zJun
	 * @date 2020年7月24日 上午10:47:02
	 */
	public String runLuaString(String fileClasspath, List<String> keys, Object[] values) {
		return stringRedisTemplate.execute(getScript(fileClasspath, String.class), keys, values);
	}
	
	/**
	 * - 获取脚本
	 * @param fileClasspath
	 * @param returnType
	 * @return
	 * @author zJun
	 * @date 2020年7月24日 上午10:46:47
	 */
	public <E> DefaultRedisScript<E> getScript(String fileClasspath, Class<E> returnType){
		DefaultRedisScript<E> redisScript = new DefaultRedisScript<>();
		redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource(fileClasspath)));
		redisScript.setResultType(returnType);
		return redisScript;
	}
}
